/**
 * 防抖函数
 * @param {Function} fn 要执行的函数
 * @param {Number} delay 延迟时间
 * @param {Boolean} immediate 第一次是否立即执行
 * @returns
 */
function deBounce(fn, delay, immediate = true) {
    let timer = null;
    let isInvoke = false;
    function wrapper(...args) {
        clearTimeout(timer);
        if (!isInvoke && immediate) {
            fn.apply(this, args);
            isInvoke = true
            return;
        }
        timer = setTimeout(() => {
            fn.apply(this, args);
            isInvoke = false;
        }, delay);
    }
    wrapper.cancle = function () {
        clearTimeout(timer);
        isInvoke = false;
    }
    return wrapper
}

/**
 * 实现间隔delay毫秒重复执行count次fn函数
 * @param {Function} fn 要执行的函数
 * @param {Number} count 执行次数
 * @param {Number} delay 执行间隔
 * @returns {Function}
 */
function timer(fn, count, delay) {
    let i = 0;
    let timer = null;
    function wrapper() {
        fn();
        i++;
        if (i < count) {
            timer = setTimeout(f, delay);
        }
    }
    wrapper.cancle = function () {
        clearTimeout(timer);
    }
    return wrapper;
}